package com.ruoyi.procured.mapper;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.procured.domain.ProcuredPlan;
import com.ruoyi.procured.domain.TbProcuredProduct;
import com.ruoyi.sale.domain.Plan;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

/**
 * 采购计划Mapper接口
 * 
 * @author ruoyi
 * @date 2023-11-03
 */
@Mapper
public interface ProcuredPlanMapper extends BaseMapper<ProcuredPlan>
{
    /**
     * 查询采购计划
     * 
     * @param planId 采购计划主键
     * @return 采购计划
     */
    public ProcuredPlan selectProcuredPlanByPlanId(@Param("planId") Long planId);

    /**
     * 查询采购计划列表
     * 
     * @param procuredPlan 采购计划
     * @return 采购计划集合
     */
    public List<ProcuredPlan> selectProcuredPlanList(ProcuredPlan procuredPlan);

    /**
     * 新增采购计划
     * 
     * @param procuredPlan 采购计划
     * @return 结果
     */
    public int insertProcuredPlan(ProcuredPlan procuredPlan);

    /**
     * 修改采购计划
     * 
     * @param procuredPlan 采购计划
     * @return 结果
     */
    public int updateProcuredPlan(ProcuredPlan procuredPlan);

    /**
     * 删除采购计划
     * 
     * @param planId 采购计划主键
     * @return 结果
     */
    public int deleteProcuredPlanByPlanId(Long planId);

    /**
     * 批量删除采购计划
     * 
     * @param planIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteProcuredPlanByPlanIds(Long[] planIds);

    /**
     * 批量删除${subTable.functionName}
     * 
     * @param planIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteTbProcuredProductByPlanIds(Long[] planIds);
    
    /**
     * 批量新增${subTable.functionName}
     * 
     * @param tbProcuredProductList ${subTable.functionName}列表
     * @return 结果
     */
    public int batchTbProcuredProduct(List<TbProcuredProduct> tbProcuredProductList);

    /**
     * 通过采购计划主键删除${subTable.functionName}信息
     * 
     * @param planId 采购计划ID
     * @return 结果
     */
    public int deleteTbProcuredProductByPlanId(Long planId);

    /**
     * 根据采购计划id查询对应的采购产品明细
     * @param planId
     * @return
     */
    public List<TbProcuredProduct> selectProcuredProductById(@Param("planId") Long planId);

    /**
     * 核准
     * @param planIds
     * @param planStatus
     * @param approver
     * @return
     */
    public int updateProcuredPlanStatus(@Param("planIds") Long[] planIds,@Param("planStatus") String planStatus,@Param("approver") String approver);

    /**
     * 查询采购产品列表
     *
     * @param tbProcuredProduct 采购产品
     * @return 采购产品集合
     */
    public List<TbProcuredProduct> selectTbProcuredProductList(TbProcuredProduct tbProcuredProduct);

    /**
     *批量查询产品数据
     * @param ids
     * @return
     */
    public List<TbProcuredProduct> selectTbProcuredProductListById(Long[] ids);

    /**
     * 修改是否选择状态
     * @param ids
     * @param selectedStatus
     * @return
     */
    public int updateProcuredProductSelectedStatus(@Param("ids") Long[] ids,@Param("selectedStatus") String selectedStatus);

    /**
     * 通过最新的时间来查询采购单号
     * @return
     */
    public String selectOrdersNumber();

    /**
     * 修改计划状态
     * @param ordersNumbers
     * @param planStatus
     * @return
     */
    public int updateProcuredPlanOrdersNumber(@Param("ordersNumbers") String[] ordersNumbers ,@Param("planStatus") String planStatus);

    /**
     * 还原产品数量
     * @param ordersNumbers
     * @return
     */
    public int updateProcuredProductByTurnedNumber(@Param("ordersNumbers") String[] ordersNumbers);

    /**
     *通过最新的时间来查询采购编号
     * @return
     */
    public String selectProcuredPlanNumber();

    /**
     *更新销售计划明细表商品已选状态
     * @return
     */
    public int updateShipmentsProductSelectStatus(@Param("productId")Long productId,
                                                  @Param("planId")Long planId,
                                                  @Param("selectStatus")String selectStatus,
                                                  @Param("updateTime") Date updateTime,
                                                  @Param("cumulativeCount") Integer cumulativeCount,
                                                  @Param("gtin") String gtin);
    /**
     *更新销售计划表已选状态
     * @return
     */
    public int updatePlanStatusByPlanId(@Param("planId")Long salesPlanId, @Param("selectStatus")String selectStatus);

    /**
     *更新销售计划明细表商品已选状态
     * @return
     */
    public int updateShipmentsProductSelectStatusByProductIds(@Param("list") List<Long> tbProcuredProductList,
            @Param("planId")Long planId, @Param("selectStatus")String selectStatus,@Param("updateTime") Date updateTime);


    /**
     * 修改采购计划下单状态
     * @param planId
     * @param statusThree
     * @param payableAmount
     * @param version1
     * @param version2
     * @return
     */
    int updatePlanStatus(@Param("planId") Long planId,
                         @Param("status") String statusThree,
                         @Param("price")BigDecimal payableAmount,
                         @Param("version1") Integer version1,
                         @Param("version2") Integer version2);

    /**
     * 采购计划详情页面查询
     * @param planId
     * @return
     */
    ProcuredPlan selectProcuredPlanByDetails(@Param("planId") Long planId);

    /**
     * 根据销售计划编号查询销售计划是否存在
     * @param salesPlanNumber
     * @return
     */
    int selectBySalePlanNumberCount(@Param("salesPlanNumber") String salesPlanNumber);

    /**
     * 待我审核的采购计划
     * @param procuredPlan
     * @return 结果
     */
    List<ProcuredPlan> getPlanWaitProcuredProcessList(ProcuredPlan procuredPlan);
    /**
     * 更新销售计划状态
     * @param procuredPlan
     * @return 结果
     */
    int updatePlanReviewStatus(ProcuredPlan procuredPlan);

    /**
     * 查询采购订单号是否已经存在
     * @param code
     * @return
     */
    int checkProcuredOrdersNumberExists(@Param("code") String code);

    /**
     * 查询对应的采购计划
     * @param planIds
     * @return
     */
    List<ProcuredPlan> selectProcuredPlanByplanIds(@Param("list") Long[] planIds);

    /**
     * 根据销售计划id查询对应的采购计划产品
     * @param id
     * @return
     */
    List<TbProcuredProduct> selectProcuredProductsBySalesPlanId(@Param("planId") Long id);

    /**
     * 根据销售计划号和产品id查询此产品是否被采购过
     * @param planNumber
     * @param productId
     * @return
     */
	List<ProcuredPlan> selectByProductId(@Param("planNumber") String planNumber,@Param("productId") Long productId);

    /**
     * 调整采购计划总件数
     * @param planId
     * @param count
     * @return
     */
    int updateTotal(@Param("planId") Integer planId,@Param("count") int count);
}
